﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Diagnostics;

namespace Zune2LyncNP
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        Process proceso;
        int segundosEspera = 3;
        Timer tiempo = new Timer();
        src.LyncManager lync;
        string NotaPersonalPrevia = "";
        bool ConectadoLync;
        System.Windows.Forms.NotifyIcon ni = new System.Windows.Forms.NotifyIcon();

        public MainWindow()
        {
            try
            {

                InitializeComponent();
                InicializarEjecución();
                Actualizar();
                SetearBindings();
                SetearTimer();
                Application.Current.DispatcherUnhandledException += (x, y) =>
                {
                    string sSource;
                    string sLog;
                    string sEvent;

                    sSource = "Z2LNP";
                    sLog = "Application";
                    sEvent = "Error no manejado. " + y.Exception.ToString();
                    if (!EventLog.SourceExists(sSource))
                        EventLog.CreateEventSource(sSource, sLog);
                    EventLog.WriteEntry(sSource, sEvent);
                    MessageBox.Show("La aplicación encontró un problema, y se cerrará. Para efectos de identificar el problema, se ha escrito un registro en el log de Windows");
                };
            }
            catch (Exception ex)
            {
                string sSource;
                string sLog;
                string sEvent;

                sSource = "Z2LNP";
                sLog = "Application";
                sEvent = "Error no manejado. " + ex.ToString();
                if (!EventLog.SourceExists(sSource))
                    EventLog.CreateEventSource(sSource, sLog);
                EventLog.WriteEntry(sSource, sEvent);
                MessageBox.Show("La aplicación encontró un problema, y se cerrará. Para efectos de identificar el problema, se ha escrito un registro en el log de Windows");
                throw;


            }
        }
        private void InicializarEjecución()
        {
            var ejecutado = ext.helperExe.ejecutarHelper(out proceso);
            if (ejecutado)
            {
                CambiarIndicador(true, sb_ConexionZune);
            }
            else
            {
                CambiarIndicador(false, sb_ConexionZune);
            }
            try
            {
                lync = new src.LyncManager();
                lync.ConectadoChanged += (sender, eventargs) =>
                {
                    if (lync.Conectado)
                    {
                        ConectadoLync = true;
                        Dispatcher.InvokeAsync(()=> {CambiarIndicador(true,sb_ConexionLync);});
                    }
                    else
                    {
                        ConectadoLync = false;
                        Dispatcher.InvokeAsync(() =>
                        {
                            CambiarIndicador(false, sb_ConexionLync);
                        });
                    }
                };
                if (lync.Conectado == true)
                {
                    ConectadoLync = true;
                    CambiarIndicador(true, sb_ConexionLync);
                }
                else
                {
                    ConectadoLync = false;
                    CambiarIndicador(false, sb_ConexionLync);
                }
                
            }
            catch (Exception)
            {
                CambiarIndicador(false, sb_ConexionLync);
            }
            if (src.Configuracion.Instancia.ConservarEstadoALCerrar)
            {
                NotaPersonalPrevia = lync.ObtenerNotaPersonalActual();
            }
            
        }
        private void SetearBindings()
        {
            //Binding cancionActual = new Binding("CancionActual");
            //cancionActual.Source = src.LogDeCanciones.ObtenerInstancia;
            //CancionActual.SetBinding(TextBlock.TextProperty, cancionActual);
            listaCanciones.DataContext = src.LogDeCanciones.ObtenerInstancia.LogCanciones;

            formatoCancion.DataContext = src.Configuracion.Instancia;
            Binding conservarEstado = new Binding("ConservarEstadoALCerrar");
            conservarEstado.Source = src.Configuracion.Instancia;
            cb_conservarEstado.SetBinding(CheckBox.IsCheckedProperty, conservarEstado);
            //cb_conservarEstado.DataContext = src.Configuracion.Instancia.ConservarEstadoALCerrar;
        }
        private void Actualizar()
        {
            if (src.Registro.Reproduciendo())
            {
                var cancion = src.Registro.leerRegistro();
                src.LogDeCanciones.ObtenerInstancia.Agregar(cancion);
                if(ConectadoLync)
                    lync.CambiarNotaPersonal(String.Format(src.Configuracion.Instancia.FormatoCancion,cancion.Nombre,cancion.Artista,cancion.Album));
                else
                    CambiarIndicador(false, sb_ConexionLync);
            }
            else
            {
                CambiarIndicador(false, sb_ConexionZune);
            }

        }
        private void SetearTimer()
        {
            tiempo.Elapsed += (x, y) =>
            {
                Dispatcher.InvokeAsync(Actualizar );
            };
            tiempo.Interval = segundosEspera * 1000;
            tiempo.Enabled = true;
        }

        

        private void CambiarIndicador(bool estado, object enque)
        {
            string estilo = "";
            if (estado)
                estilo = "ConectadoSi";
            else
                estilo = "ConectadoNo";

            if (FindResource(estilo) as Style != null)
            {
                ((TextBlock)enque).Style = FindResource(estilo) as Style;
            }
        }

        #region ManejadoresEventos

        protected override void OnClosed(EventArgs e)
        {
            ext.helperExe.CerrarHelper(proceso);
            base.OnClosed(e);
        }
        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
            if (MessageBox.Show("Está Seguro que quiere cerrar?. Si cierra, no se actualizará más la canción en Lync; para seguir ejecutando puede usar el botón de minimizar a la bandeja del sistema",
                "Confirme si desea cerrar", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
            {
                if (src.Configuracion.Instancia.ConservarEstadoALCerrar && ConectadoLync)
                {
                    lync.CambiarNotaPersonal(NotaPersonalPrevia);
                }
                base.OnClosing(e);
            }
            else
            {
                e.Cancel = true;
            }

        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            //this.WindowState = System.Windows.WindowState.Minimized;
            
            ni.Icon = new System.Drawing.Icon("small.ico");
            ni.Visible = true;
            ni.DoubleClick +=
                delegate(object sender1, EventArgs args)
                {
                    this.Show();
                    this.WindowState = WindowState.Normal;
                    ni.Visible = false;
                };
            this.Hide();

        }

        #endregion
 
    }
}
